// // 封装集合类
// function Aaa() {
//   this.abc = {}
//   Aaa.prototype.hhh = function () {
//     var bbb = 'abc'
//     return bbb
//   }
// }

// var aaa = new Aaa()

// console.log(aaa.values())

function Set() {
  // 不需要内部类
  // 属性
  this.items = {}

  // 方法
  // 添加新项
  Set.prototype.add = function (value) {
    // 判断当前元素是否已经包含了该元素
    if (this.has(value)) {
      return false
    }
    // 若集合还没有该值，则添加
    this.items[value] = value // 键与值相同
    return true
  }

  // 判断是否有该值
  Set.prototype.has = function (value) {
    // 判断是否有value属性/键
    return this.items.hasOwnProperty(value)
  }
  // 删除一个值
  Set.prototype.remove = function (value) {
    if (!this.has(value)) {
      return false
    }
    delete this.items[value]
    return true
  }

  // 清空该集合，直接指向一个空对象
  Set.prototype.clear = function () {
    this.items = {}
  }

  // 返回该集合是元素数量
  Set.prototype.size = function () {
    return Object.keys(this.items).length
  }
  // 返回一个包含该集合所有元素的数组
  Set.prototype.values = function () {
    return Object.keys(this.items)
  }

  // *******************************************************
  // 集合间的操作

  // 并集
  Set.prototype.union = function (otherSet) {
    // this:集合对象A
    // otherSet集合对象B
    // 创建一个新集合
    var unionSet = new Set()

    // 把A集合中所有的元素添加到新集合中
    var values = this.values()
    for (var i = 0; i < values.length; i++) {
      unionSet.add(values[i])
    }
    // 取出B集合中的元素，判断是否需要加到新集合
    values = otherSet.values()
    for (var i = 0; i < values.length; i++) {
      unionSet.add(values[i])
    }
    return unionSet
  }
  // 交集
  Set.prototype.intersection = function (otherSet) {
    // this:集合对象A
    // otherSet集合对象B
    // 创建一个新集合
    var intersection = new Set()
    // 2、从A中同时取出一个元素，判断是否同时存在集合B中，有则存于新集合
    var values = this.values()
    for (var i = 0; i < values.length; i++) {
      var item = values[i]
      if (otherSet.has(item)) {
        intersection.add(item)
      }
    }
    return intersection
  }

  // 差值
  Set.prototype.difference = function (otherSet) {
    // this:集合对象A
    // otherSet集合对象B
    // 创建一个新集合
    var differenceSet = new Set()

    // 取出A集合一个元素，判断是否存在于B中，不存在，则添加到新集合中
    var values = this.values()
    for (var i = 0; i < values.length; i++) {
      var item = values[i]
      if (!otherSet.has(item)) {
        differenceSet.add(item)
      }
    }
    return differenceSet
  }
  // 判断A是否为B子集
  Set.prototype.subSet = function (otherSet) {
    // this:集合对象A
    // otherSet集合对象B
    // 遍历所有A中元素，若发现A中有元素在集合B中不存在，则返回false
    // 如果遍历整个集合都没有返回false，则返回true
    var values = this.values()
    for (var i = 0; i < values.length; i++) {
      var item = values[i]
      if (!otherSet.has(item)) {
        return false
      }
    }
    return true
  }
}

// var set = new Set()
// console.log(set.add('abc'))
// console.log(set.add('abc'))
// console.log(set.add('cba'))
// console.log(set.add('nba'))
// console.log(set.add('mba'))
// console.log(set.values())
// console.log(set.remove('mba'))
// console.log(set.values())
// console.log(set.has('abc'))
// console.log(set.size())

var setA = new Set()
var setB = new Set()
setA.add('aaa')
setA.add('bbb')
setA.add('ccc')
setB.add('ddd')
setB.add('eee')
setB.add('aaa')

// console.log('求集合并集')
// var unionSet = setA.union(setB)
// console.log(unionSet.values())

// console.log('求集合交集')
// var intersection = setA.intersection(setB)
// console.log(intersection.values())

// console.log('求集合差值')
// var difference = setA.difference(setB)
// console.log(difference.values())

console.log('求集合子值')
var subset = setA.subSet(setB)
console.log(subset)
